package com.sky.result;

import lombok.Data;

import java.io.Serializable;

/**
 * 后端统一返回结果
 * @param <T>
 */
@Data
public class Result<T> implements Serializable {

    private Integer code; //编码：1成功，0和其它数字为失败
    private String msg; //错误信息
    private T data; //数据

    public static <T> Result<T> success() {
        Result<T> result = new Result<T>();
        result.code = 1;
        return result;
    }

    public static <T> Result<T> success(T object) {
        Result<T> result = new Result<T>();
        result.data = object;
        result.code = 1;
        return result;
    }

    /*
    上面为何用了两个sucess方法：方法重，不同业务场景需要不同的响应格式，重载方法让调用更简洁
    无参 success()：仅表示成功，无数据返回。当某个操作不需要返回具体数据，只需告知前端“操作成功”时使用。
    示例：用户退出登录（logout），只需返回 { "code": 1 }，无需额外数据。删除数据成功，无需返回被删除的数据。

    带参 success(T object)：成功且携带数据。当操作成功后需要返回具体数据时使用。
    示例：用户登录成功，返回 { "code": 1, "data": { "token": "xxx", "userId": 1001 } }。
查询用户信息，返回用户详情数据。

    二者通过重载实现“不同场景，同一语义”，是 Java 中常见的优雅设计模式。

    * */

    public static <T> Result<T> error(String msg) {
        Result result = new Result();
        result.msg = msg;
        result.code = 0;
        return result;
    }

}
